#include "AristaGrafo.h"
#include "NodoGrafo.h"
//#define DEBUG_MODE YES


NodoGrafo::NodoGrafo(unsigned _numeroDeVertice): numeroDeVertice(_numeroDeVertice) {
	adyacencias = new std::vector<AristaGrafo*>();
	fueVisitado = false;
	fueEtiquetado = false;
}

NodoGrafo::~NodoGrafo() {
	delete(adyacencias);
}

void NodoGrafo::agregarAdyacencia(NodoGrafo* nodoAdyacente, unsigned etiqueta, bool esDirecta){

	AristaGrafo *nuevaAdyacencia = new AristaGrafo(nodoAdyacente, etiqueta, esDirecta);
	adyacencias->push_back(nuevaAdyacencia);
}

unsigned NodoGrafo::getNumeroDeVertice() const {
    return numeroDeVertice;
}

bool NodoGrafo::getFueVisitado() const {
    return fueVisitado;
}

void NodoGrafo::setFueVisitado(bool fueRecorrido) {
    this->fueVisitado = fueRecorrido;
}

bool NodoGrafo::getFueEtiquetado() {
	return fueEtiquetado;
}

void NodoGrafo::setFueEtiquetado(bool _fueEtiquetado) {
	fueEtiquetado = _fueEtiquetado;
}

bool NodoGrafo::adyacenciaVisitada(unsigned numeroAdyacencia) {
	return (adyacencias->at(numeroAdyacencia)->getNodoAdyacente()->fueVisitado);
}
bool NodoGrafo::adyacenciaEtiquetada(unsigned numeroAdyacencia) {
	return (adyacencias->at(numeroAdyacencia)->getNodoAdyacente()->fueEtiquetado);
}

std::vector<AristaGrafo*> *NodoGrafo::getAdyacencias() {
    return adyacencias;
}

unsigned NodoGrafo::getEtiqueta() const {
    return etiqueta;
}
bool NodoGrafo::setEtiquetaParaAdyacencia(unsigned numeroDeAdyacencia, unsigned mod) {
	AristaGrafo *adyacente;
	unsigned valorArista = 0;
	unsigned etiquetaNodoAdyacente = 0;
	bool encontrado = false;
	unsigned i = 0;

	while (!encontrado && i < adyacencias->size()) {
		adyacente = adyacencias->at(i);
		if (adyacente->getNodoAdyacente()->getNumeroDeVertice() == numeroDeAdyacencia) {
			encontrado = true;
		}
		i ++;
	}
	if (encontrado) {

		valorArista = adyacente->getEtiqueta();
		int resta = (valorArista - etiqueta);
		etiquetaNodoAdyacente =  (resta >=0)? (resta % mod): (mod + resta);

		#if defined(DEBUG_MODE)
		std::cout << std::endl;
		std::cout << "Entro a etiquetar: "  << std::endl;
		std::cout << "Valor Arista: " << valorArista << std::endl;
		std::cout << "Etiqueta nodo que esta: " << etiqueta << std::endl;
		std::cout << "ETIQUETO complejo AL NODO: " << adyacente->getNodoAdyacente()->getNumeroDeVertice() << " con etiqueta "<< etiquetaNodoAdyacente << std::endl;
		std::cout << std::endl;

		#endif
		adyacente->getNodoAdyacente()->setEtiqueta(etiquetaNodoAdyacente);

	}
	return encontrado;
}


void NodoGrafo::setEtiqueta(unsigned  etiqueta) {
    this->etiqueta = etiqueta;
}

NodoGrafo* NodoGrafo::getNodoParaAdyacencia(unsigned numeroDeAdyacencia) {
	AristaGrafo *adyacencia = adyacencias->at(numeroDeAdyacencia);
	return adyacencia->getNodoAdyacente();
}

bool NodoGrafo::getRelacionEsDirecta(unsigned numeroDeAdyacencia) {
	AristaGrafo *adyacencia = adyacencias->at(numeroDeAdyacencia);
	return adyacencia->getEsDirecta();
}
